package com.bkhech.bigdata.spark.akka;

import akka.actor.typed.ActorRef;
import akka.actor.typed.ActorSystem;
import akka.actor.typed.Behavior;
import akka.actor.typed.javadsl.Behaviors;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author guowm
 * @date 2022/7/11
 */
@Slf4j
public class AkkaMain {
    /**
     * RootBehavior 是启动用的 actor，可以在里面执行一些初始化的任务。
     */
    public static class RootBehavior {
        static Behavior<Void> create() {
            return Behaviors.setup(context ->{
                // Behaviors.empty()
                // 创建一个actor，并给它发送消息
                final ActorRef<String> actorRef = context.spawn(HelloActor.create(), "Hello");
                actorRef.tell("hello");
                return Behaviors.empty();
            });
        }
    }


    public static void main(String[] args) {
        //指定akka系统启动的端口
        String port = "5001";
        //加载akka-local.conf的配置文件，并替换"akka.remote.artery.canonical.port"这个参数
        Map<String, Object> overrides = new HashMap<>(16);
        overrides.put("akka.remote.artery.canonical.port", port);
        Config config = ConfigFactory.parseMap(overrides)
                .withFallback(ConfigFactory.load("akka-local"));
        //启动akka系统，启动时指定一个behavior，并给系统命名
        ActorSystem<Void> system = ActorSystem.create(RootBehavior.create(), "local-example", config);
        log.info("=== actor system started ===");

    }

}
